<?php
/**
 * Created by PhpStorm.
 * User: s.utkin
 * Date: 13.11.2014
 * Time: 18:17
 */

namespace Multilang\Behaviors;

use Multilang\TranslateEntities;

trait Translate
{

	/**
	 * Переводит сущность по ее id
	 *
	 * @param $entityCode - символьный идентификатор переводимой сущности
	 * @param array $params - ассоциативный массив с параметрами ('%countItems{item;items}%', ['countItems' => $countItems])
	 * @param string $langId - идентификатор языка (если не указан, то берется из запроса)
	 * @param string $actionName - Экшн, используемый для конкретных мест. (Если не указан - берется из запроса).
	 * @return string
	 */
	public function translate($entityCode, $params = [], $langId = null, $action = null)
	{
		if ($langId === null) {
			$langId = $this->request->_langId;
		}

		$actionName = $this->request->action;

		if($action !== null)
		{
			$actionName = $this->prepareActionName($action);
		}

		$entityModel = TranslateEntities::getByCodeAndAction($entityCode, $actionName);

		# Возвращаем перевод
		$translation = '.' . $entityCode;
		$translationLangId = \MultilangConfig::getDefaultLanguageCode();
		if ($entityModel && isset($entityModel->translateMain[$langId])) {
			$translation = $entityModel->translateMain[$langId];
			$translationLangId = $langId;
		}

		if (!empty($params)) {
			$translation = static::processTextPlural($translation, $params, $translationLangId);
		}

		# Записываем идентификатор в канал
		$this->response->append('translateEntities', (string)$entityModel);

		return $translation;
	}

	/**
	 * Заменяет шаблон на множественную форму слова:<br>
	 * "%имя__параметра% %имя__параметра{словоформа__1;словоформа__2;...;словоформа_n}%"<br>
	 * Количество словоформ зависит от языка.
	 *
	 * @param $text - текст с шаблоном
	 * @param array $params - массив параметров для шаблона
	 * @param $langId - символьный идетификатор языка
	 * @throws \Exception
	 * @return mixed|string
	 */
	public static function processTextPlural($text, $params, $langId)
	{

		# Вставляем параметры в шаблон
		foreach ($params as $name => $value) {
			$text = str_replace("%$name%", $value, $text);
		}

		# Находим шаблоны с вариантами слов, зависящих от числа
		$templatesCount = preg_match_all('/\%([a-zA-Z0-9_-]+)\{([^\}]+)\}\%/', $text, $matches);

		if ($templatesCount < 1) {
			return $text;
		}

		# Получаем конфиг для языка
		$langInfo = \MultilangConfig::get($langId);

		# Получаем количество словоформ, требуемое языком
		$pluralCasesCount = $langInfo['pluralInfo']['size'];

		# Получаем ссылку на функцию, вычисляющую индекс словоформы по заданному числу
		$getPluralIndex = $langInfo['pluralInfo']['getPluralIndex'];

		# Заменяем все шаблоны
		for ($i = 0; $i < $templatesCount; $i++) {
			# Получаем список словоформ из шаблона
			$languageCases = explode(';', $matches[2][$i]);

			# Если количество словоформ отличаетстя, от количества, требуемого языком - бросаем эксепшн
			if (count($languageCases) != $pluralCasesCount) {
				continue;
			}

			# Получаем имя нужного параметра
			$paramName = $matches[1][$i];

			# Если нужный параметр не был передан - бросаем эксепшн
			if (!isset($params[$paramName])) {
				continue;
			}

			# Получаем значение параметра шаблона
			$plural = (int)$params[$paramName];

			# Получаем индекс словоформы
			$caseIndex = $getPluralIndex($plural);

			# Получаем по индексу нужное слово в списке слофоформ из шаблона
			$word = $languageCases[$caseIndex];

			# Заменяем шаблон на нужное слово
			$text = str_replace($matches[0][$i], $word, $text);
		}

		return $text;
	}
}